package com.szrt.java.day20170113.ch02;



import java.lang.reflect.Method;
import org.junit.Test;



/**
 * 给我一个字符串  类的全路径名
 * 1 调用类的一个具体的方法  sang
 * 2 可以拿到这个类中的所有方法
 *
 */
public class MethodTest {
	
	
	
	@Test
	public void addTest() throws Exception {
		
		//1 拿到类
		Class<?> clazz =Class.forName("com.szrt.java.day20170113.ch01.Student");
		
		//2 拿到类的对象 调用类无参的构造方法...
		Object student =clazz.newInstance();
		
		//3 拿到指定的方法 并调用它 declared 申明=定义  只要有定义了这个方法就行，不管访问修饰符  private的方法可以拿到
		Method method = clazz.getDeclaredMethod("add", double.class,double.class);
		method.setAccessible(true);
		Object jg = method.invoke(student, 1.23,3.456);
		System.out.println(jg);
		
		
	}
	
	/**
	 * 调用某个具体的方法
	 * @throws Exception
	 */
	@Test
	public void callMethod01() throws Exception {
		Class<?> clazz = Class.forName("com.szrt.java.day20170113.ch01.Teacher");
		System.out.println(clazz);
		
		//clazz 代表一份字节码 汽车图纸    obj代表的是对象的实例 一辆具体的汽车   重点：凡是对象都是通过字节码造出来的。
		Object obj =clazz.newInstance();
		
		Method method =clazz.getDeclaredMethod("sang");
		System.out.println(method);
		method.invoke(obj);
		
		
		
	}
	
	
	@Test
	public void callMethod02() throws Exception {
		//1clazz代表1个类  Student
		Class<?> clazz = Class.forName("com.szrt.java.day20170113.ch01.Student");
		System.out.println(clazz);
		
		//2 student代表的是类Student的对象
		Object student =clazz.newInstance();
		System.out.println(student);
		
		Method method =clazz.getDeclaredMethod("add", int.class,int.class);
		System.out.println(method);
		
		//强制打开访问权限 所有的方法都可以调用 及时是private的方法
		method.setAccessible(true);
		
		//方法的调用一定要在对象上调用
		Object jieguo = method.invoke(student, 1,2);
		System.out.println(jieguo);
		
		
		
	}
	
	/**
	 * 拿到这个类中的所有方法
	 * @throws Exception
	 */
	@Test
	public void findAllMethods() throws Exception {
		//加载某个具体字符串格式的类
		Class<?> clazz = Class.forName("com.szrt.java.day20170113.ch01.Student");
		System.out.println(clazz);
		
		
		//getDeclaredMethods  邪魔歪道  可以拿到private的方法
		//Method[] methods =clazz.getDeclaredMethods();  9 private
		
		
		//getMethods 正人君子 只能拿自己public的方法  还可以拿父类public的方法
		Method[] methods =clazz.getMethods();       //16
		
		System.out.println(methods.length);
		
		for(Method method:methods){
			System.out.println(method.toString());
		}
		
	}

}
